
#ifndef __LCD12864_H
#define __LCD12864_H

#include "stm32f10x.h" 
#include "delay.h"
#include <stdbool.h>
#include <stdio.h>
#include <string.h>
/*******************************************************************************
RS(串行模式:CS）
并行模式：
RS=“H”,表示DB7——DB0为显示数据
RS=“L”,表示DB7——DB0为显示指令数据

R/W(串行模式:SID)
并行模式：
R/W=“H”,E=“H”,数据被读到DB7——DB0
R/W=“L”,E=“H→L”, DB7——DB0的数据被写到IR或DR

E(串行模式:SCLK)
H/L使能信号
*******************************************************************************/
// PB15--NSS--CS--RS
// PB4--SCK--CLK--E
// PA6--MISO--(not used)
// PB3--MOSI--SDIO--R/W

#define LCD_SID             GPIO_ODR_ODR3
#define LCD_SID_HIGH        GPIO_SetBits(GPIOB,GPIO_Pin_3)  //R/W
#define LCD_SID_LOW         GPIO_ResetBits(GPIOB,GPIO_Pin_3)

#define LCD_CS_HIGH         GPIO_SetBits(GPIOB,GPIO_Pin_15)   // RS
#define LCD_CS_LOW          GPIO_ResetBits(GPIOB,GPIO_Pin_15)

#define LCD_CLK_HIGH        GPIO_SetBits(GPIOB,GPIO_Pin_4)   //E
#define LCD_CLK_LOW         GPIO_ResetBits(GPIOB,GPIO_Pin_4)

#define BLK_ON             GPIO_SetBits(GPIOC,GPIO_Pin_13)               
#define BLK_OFF            GPIO_ResetBits(GPIOC,GPIO_Pin_13)          

/* 定义串行发送数据的时候的指令 */
#define writecommand            0xF8
#define writedata               0xFA
#define READ_STATE              0xFC
#define readdata                0xFE

#define	LCD_ADDRESS_RESET      	        0x02	//地址归零	 
#define	LCD_BASIC_FUNCTION	  	0x30	//基本指令集
#define	LCD_EXTEND_FUNCTION	   	0x34	//扩充指令集

//扩展指令集预定义
#define	LCD_AWAIT_MODE			0x01	 	//待命模式	
#define LCD_ROLLADDRESS_ON		0x03		//允许输入垂直卷动地址
#define LCD_IRAMADDRESS_ON		0x02		//允许输入IRAM地址	
#define	LCD_SLEEP_MODE			0x08	 	//进入睡眠模式
#define	LCD_NO_SLEEP_MODE		0x0c	 	//脱离睡眠模式
#define LCD_GRAPH_ON			0x36		//打开绘图模式
#define LCD_GRAPH_OFF			0x34		//关闭绘图模式(属于扩充指令集动作)

#define LCD_CURSOR_LEFT			0x14		//游标右移
#define LCD_CURSOR_RIGHT  	        0x10		//游标左移

static void SendByte(u8 dat);
static u8 ReceiveByte(void);
static u8 readBF(void);

void LCD_WriteCMD(u8 data);
void LCD_WriteDATA(u8 data);

void LCD_Clear_DDRAM();
void LCD_Clear_GDRAM();

void LCD_Init(void);

void LCD_SetPos(u8 row,u8 column);

void ShowCharPos(u8 row, u8 col,u8 dat);

void ShowString(u8 *s);
void ShowStringPos(u8 row, u8 col,char *s);
void ShowNumPos(u8 row, u8 col, u16 num,u8 DecOrHex);
void Show2NumPos(u8 row, u8 col, u8 num);

void ShowGB(unsigned char *HZ);
void ShowGBPos(u8 row, u8 col, u8 *HZ);
void ShowGBStringPos(u8 row, u8 col,  u8 *s);

void ShowBlankPos(u8 row, u8 col, u8 num);

#endif

